您如何以正式和严格的方式定义(解释)什么是 C++ 中的引用类型?
我试图用谷歌搜索,并查看了 Stroustrup 的“C++ 编程语言”,但我在那里没有看到这个概念的定义。
引用是一个别名,是一个对象的替代名称。它本身不是对象(因此*也不*是指针,即使它们的某些用途与指针的用途重叠)。
引用对它们的处理有一定的限制,这与它们的非对象性有关。例如,您不能创建引用数组。一旦声明它们,它们就必须被初始化(绑定,就位),因为如果没有对象别名,它们就不可能存在。
但是,您可以存储它们,它们遵循自动变量或成员变量的规则。它们的用途之一是戳穿 C++ 的按值传递函数调用。
请注意,const 引用作为别名有一个简洁的副作用:当绑定到一个临时(即未命名的)对象时,它们为该对象命名,因此将其生命周期延长到引用本身的生命周期。
{ // Block scope Foo fooVal = makeFoo(); // Say makeFoo() returns a (temporary, unnamed) Foo // Here the temporary Foo is dead (fooVal is a copy). // Foo &fooRef = makeFoo(); // Error, reference is non-const Foo const &fooCRef = makeFoo(); // All good // ... // The second temporary is still alive fooCRef.doSomethingFunny(); // Works like a charm ! } // The second temporary dies with fooRef
但请注意,有可能(尽管是人为的)使对象超出范围而引用仍指向它。然后,您将拥有不再使用的悬空引用(这样做将是未定义的行为)。
Foo *fooPtr = new Foo; // Here is a Foo Foo &fooRef = *fooPtr; // Here is an alias for that Foo delete fooPtr; // Here is the end of that Foo's life fooRef.doSomethingFunny(); // Here comes trouble...